<?php
    /**
     * @name 公共函数库
     * @copyright tcsos inc
     * @version cooperation v1.0
     */

//定义系统级常量
define('NOW', time());  //当前时间，此变量会有最多几秒的差距，使用时请注意


    /**
     * 获取_get 或者 _post 参数并过滤
     *
     * @param string $name                  参数名
     * @param bool $is_char                 是否字符(0-9 a-z 和 _)
     * @param bool $is_number               是否数字
     * @param bool $is_mail                 是否邮件
     * @param bool $default                 默认值
     * @param bool $is_html_specialchars    是否转义HTML标签
     * @return:    成功返回处理值 ，失败返回false
     */
    function request($name , $is_char = false , $is_number = false , $is_mail = false , $default = '', $is_html_specialchars = false){
        $data = false;
        $data = $_GET[$name];

        if(!is_array($data)) {
            //获取字符编码
            $encode = get_string_encoding($data);
            if(in_array($encode, array('EUC-CN'))) {
                $data = mb_convert_encoding($data, 'UTF-8', 'gb2312');
            }
        }

        //默认值
        if($data == '' && ($default != '' || $default == 0)){
            $data = $default;
        }


        //判断是否为空
        if($data != 0 && $data == ''){
            return false;
        }
        //判断az ， 0 -9
        if($is_char && !is_char($data)){
            return false;
        }
        //判断数字格式
        if($is_number && !is_numeric($data)){
            return false;
        }
        //判断邮件格式
        if($is_mail && !is_email($data)){
            return false;
        }
        //数组则不处理
        if(!is_array($data)) {
	        //进行HTML转义处理
	        if($is_html_specialchars) {
	            $data = htmlspecial($data);
	        }
	        else{
	        	//如果不进行HTML转义，则去除HTML标签，富媒体文本采用UBB模式
	        	$data = strip_tags($data);
	        }
	    }
        return $data;
    }

    /**
     * 获取文字编码
     *
     * @param mixed $title
     */
    function get_string_encoding($title) {
        return mb_detect_encoding($title, array('ASCII', 'UTF-8','GB2312', 'GBK','BIG5'));
    }

    /**
     * 将中文空格转换为英文空格，并去掉前后空格
     *
     * @author zhouqi 2012-1-9 PM 05:34:37
     * @param string $content       内容
     * @param string $to_encoding    目标编码，默认为UTF-8
     * @param string $from_encoding  源编码，默认为GBK
     * @return string
     */
    function replace_zh_space($content, $to_encoding = 'UTF-8', $from_encoding = 'GBK') {
        $content = mb_convert_encoding($content, $to_encoding, $from_encoding);
        $str = mb_convert_encoding("　", $to_encoding, $from_encoding);
        $content = mb_eregi_replace($str, " ", $content);
        $content = mb_convert_encoding($content, $from_encoding, $to_encoding);
        $content = str_replace("", '', $content);

        $content = trim($content);
        return $content;
    }


    /*
    declare:   判断是否为邮件格式
    parameter: 电子邮件名
    return:    成功返回true，失败返回false
    */
    function is_email($email) {
        if(!$email){
            return false;
        }
        return(eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email));
    }

    /**
     * 判断是否合法日期2011-01-01
     *
     * @param mixed $date   日期
     * @return string
     */
    function is_date($date, $space = '-') {
        if(!$date) {
            return false;
        }

        //验证日期格式是否正常
        if(!preg_match("/^\d{4}" . $space . "\d{1,2}" . $space . "\d{1,2}$/s", $date)) {
            return false;
        }

        //验证日期是否正常
        list($y, $m, $d) = explode($space, $date);
        if(!checkdate($m, $d, $y)) {
            return false;
        }

        return $date;
    }

    /**
     * 判断是否为手机号码
     *
     * @param mixed $mobile
     * @return int
     */
    function is_mobile($mobile){
        $f = false;
        $pattern = "/^\d{11}$/";
        if(preg_match($pattern,$mobile))
        {
            $f = true;
        }
        return $f;
    }



    /*
    declare:   判断是否为az 09 _
    parameter: 字符
    return:    成功返回true，失败返回false
    */
    function is_char($chars) {
        if(!$chars){
            return false;
        }
        return(eregi("[a-zA-Z0-9_]$",$chars));
    }

    /**
     * 获取客户端IP
     *
     * @return 成功返回对应值，失败返回127.0.0.1
     */
    function get_remote_ip(){
        if(!empty($_SERVER["HTTP_CLIENT_IP"])){
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
            for ($i = 0; $i < count($ips); $i++) {
                if (!eregi ("^(10|172.16|192.168).", $ips[$i])) {
                    $ip = $ips[$i];
                    break;
                }
            }
        }
        return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }


    /*
    declare:   跳转到URL
    parameter: URL
    return:    跳转,无返回
    */
    function location($url = ''){
        if($url == ''){
            $url = '/';
        }
        echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><script>window.location='".$url."'</script>";
        exit();
    }

    /**
     * 跳转到MSG页面
     *
     * @author zhouqi 2012-8-10 AM 11:51:24
     * @param string $msg   消息
     * @param string $url   URL
     * @param string $self  是否当前页
     */
    function location_msg($msg, $url = '', $self = 1) {
        if(!$url) {
            $url = $_SERVER['HTTP_REFERER'];
        }

        $url = urlencode($url);
        location("/message/prompt?msg={$msg}&url={$url}&self={$self}");
    }

    function location_msgwap($msg, $url = '', $self = 1) {
    	if(!$url) {
    		$url = $_SERVER['HTTP_REFERER'];
    	}

    	$url = urlencode($url);
    	location("/message/promptwap?msg={$msg}&url={$url}&self={$self}");
    }


    /*
    declare:   弹出JS窗口
    parameter: msg , url
    return:    弹出JS窗口，无返回
    */
    function alert_js_box($msg = '' , $herf = ''){
        @header("Content-type: text/html; charset=utf-8");
        $alert = "alert('".$msg."');";
        if(is_null_str($msg)){
            $alert = '';
        }
        $rf = "window.location='".$herf."';";
        if(is_null_str($herf)){
            $rf = "history.back();";
        }
        echo "<script>".$alert.$rf."</script>";
        exit();
    }

    /**
     * 设置cookie
     *
     * @param string $key       键
     * @param string $value     值
     * @param int $expday       天数
     * @param string $path      路径
     * @param string $domain    域
     * @return bool
     */
    function set_cookie($key , $value , $expday = 7 , $path = '/' , $domain = ''){
        if($key == ''){
            return false;
        }
        $key = md5($key);
        $value = base64_encode($value);

        $time = 0;
        if($expday > 0){
            $time = time()+3600*24*$expday;
        }

        if($domain == ''){
            setcookie($key,$value,$time,$path);
        }else{
            setcookie($key,$value,$time,$path,$domain);
        }
        return true;
    }

    /**
     * 获取cookie
     *
     * @param string $key   键
     * @return string       设置失败为false, 成功为cookie值
     */
    function get_cookie($key){
        if($key == ''){
            return false;
        }
        $key = md5($key);
        return base64_decode($_COOKIE[$key]);
    }

    /**
     * 获取session_id
     *
     * @author zhouqi 2012-8-8 PM 05:00:55
     */
    function id_session() {
        if(!isset($_SESSION)) {
            start_session($sid);
        }

        return session_id();
    }

    /**
     * 设置SESSION值
     *
     * @author zhouqi 2012-8-8 PM 04:46:12
     * @param string $name  名称
     * @param string $val   值
     * @param string $sid   session_id
     */
    function set_session($name, $val, $sid = '') {

        if(!isset($_SESSION)) {
            start_session($sid);
        }

        $_SESSION[$name] = $val;
    }

    /**
     * 获取SESSION值
     *
     * @author zhouqi 2012-8-8 PM 04:47:26
     * @param string $name  名称
     * @param string $sid   session_id
     */
    function get_session($name, $sid = '') {

        if(!isset($_SESSION)) {
            start_session($sid);
        }

        return $_SESSION[$name];
    }

    /**
     * 启动session
     *
     * @param string $sid   session_id
     */
    function start_session($sid = '') {
        if($sid) {
            session_id($sid);
        }

        session_start();
    }

    /**
     * 销毁SESSION某个变量
     *
     * @author zhouqi 2012-8-10 AM 10:22:42
     * @param string $name  名字
     * @param string $sid   session_id
     */
    function unset_session($name, $sid = '') {
        start_session($sid);
        session_unset($name);
    }

    /**
     * 销毁所有的SESSION
     *
     * @author zhouqi 2012-8-10 AM 10:42:01
     * @param string $sid   session_id
     */
    function destroy_session($sid = '') {
        start_session($sid);
        session_destroy();
    }

    /**
     * 删除cookie
     *
     * @param string $key   键
     * @param mixed $domain 域
     * @return bool 设置失败为false, 成功为true
     */
    function del_cookie($key, $domain = ''){
        $cook_ary = $key ? array(md5($key) => '') : $_COOKIE;

        foreach($cook_ary as $k => $v) {
            setcookie($k, NULL, (time() - 3600), '/', $domain);
            unset($_COOKIE[$k]);
        }

        return true;
    }

    /*
    declare:   获取网页内容
    parameter: url ...
    return:    设置失败为false, 成功返回指定值
    */
    function dfopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = false, $ip = '', $timeout = 15, $block = true) {
        $return = '';
        $matches = parse_url($url);
        $host = $matches['host'];
        $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
        $port = !empty($matches['port']) ? $matches['port'] : 80;
        if($post) {
            $out = "POST {$path} HTTP/1.0\r\n";
            $out .= "Accept: */*\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
            $out .= "Host: {$host}\r\n";
            $out .= 'Content-Length: '.strlen($post)."\r\n";
            $out .= "Connection: Close\r\n";
            $out .= "Cache-Control: no-cache\r\n";
            $out .= "Cookie: {$cookie}\r\n\r\n";
            $out .= $post;
        } else {
            $out = "GET {$path} HTTP/1.0\r\n";
            $out .= "Accept: */*\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
            $out .= "Host: {$host}\r\n";
            $out .= "Connection: Close\r\n";
            $out .= "Cookie: {$cookie}\r\n\r\n";
        }

        $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
        if(!$fp) {
            return false;
        }
        stream_set_blocking($fp, $block);
        stream_set_timeout($fp, $timeout);
        @fwrite($fp, $out);
        $status = stream_get_meta_data($fp);
        if(!$status['timed_out']) {
            while (!feof($fp)) {
                $header = @fgets($fp);
                if($header && ($header == "\r\n" ||  $header == "\n")) {
                    break;
                }
            }
            $stop = false;
            while(!feof($fp) && !$stop) {
                $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
                $return .= $data;
                if($limit) {
                    $limit -= strlen($data);
                    $stop = $limit <= 0;
                }
            }
        }
        @fclose($fp);
        return $return;

    }

    /*
    declare:   获取当前时间 Y-m-d H:i:s
    parameter:
    return:    Y-m-d H:i:s
    */
    function get_time($t = 0){
        if($t == 0){
            $t = time();
        }
        return date("Y-m-d H:i:s",$t);
    }

    /*
    declare:   获取当前日期 Y-m-d
    parameter:
    return:    Y-m-d
    */
    function get_date($t = 0){
        if($t == 0){
            $t = time();
        }
        return date("Y-m-d",$t);
    }

    /**
     * 获取年份
     *
     * @param int $t
     * @return string
     */
    function get_year($t = 0){
        if($t == 0){
            $t = time();
        }
        return date("Y",$t);
    }

    /**
     * 获取月份
     *
     * @param int $t
     * @return string
     */
    function get_month($t = 0){
        if($t == 0){
            $t = time();
        }
        return date("m",$t);
    }



    /*
    declare:   获取星期几
    parameter:
    return:    Y-m-d
    */
    function get_week($t = 0){
        if($t == 0){
            $t = time();
        }
        $weekarray=array(0,1,2,3,4,5,6);
        return $weekarray[date("w",$t)];
    }

    /**
     * 时间格式化
     *
     * @param int $t 时间戳
     * @param string $str 格式
     */
    function time_format($t, $str = 'Y-m-d') {
        if($t <= 0) {
            return false;
        }

        //时间间隔
        $diff = time() - $t;

        if($diff <= 86400) {
            $str = '今天';
        } else {
            $str = 'm月d日';
        }

        $str .= ' H:i';

        return date($str, $t);
    }

    /**
     * 时间格式化
     *
     * @param int $t  时间
     * @param int $p  提前
     * @param bool $random 随机
     * @return string
     */
    function time_format_day($t,$p=1,$random=false){
        $diff = (time() - $t)*$p;

        if($diff < 60){
            return (int)$diff."秒前";
        }
        if($diff >= 60 && $diff <3600 ){
            $minute=intval($diff/60);
            if($random)
            {
                $minute=$minute+rand(-9,9);
                $minute=max(1,$minute);
            }
            return $minute."分钟前";
        }
        if($diff>=3600 && $diff < 86400){
            return (int)($diff/3600)."小时前";
        }
        if($diff>=86400 && $diff < 2592000){
            return (int)($diff/86400)."天前";
        }
        return date('Y-m-d',$t);
    }

    /**
     * 获取结束事件
     *
     * @param mixed $t  时间
     */
    function get_end_time($t){
        $diff = $t - time();

        if($diff < 60){
            return (int)$diff."秒后";
        }


        if($diff >= 60 && $diff <3600 ){
            $minute=intval($diff/60);
            return $minute."分钟";
        }

        if($diff>=3600 && $diff < 86400){
            return (int)($diff/3600)."小时";
        }

        $day = (int)($diff/86400)."天";
        $hour = (int)(($diff - $day*86400)/3600);
        $min = (int)(($diff - $day*86400 - $hour*3600)/60);

        if($hour <= 0){
            $hour = "";
        }else{
            $hour = $hour."小时";
        }
        if($min <= 0){
            $min = "";
        }else{
            $min = $min."分";
        }

        return $day.$hour.$min;

    }

    /**
     *
     * 进行字符串addslashes的处理
     * @param mixed    $str
     */
    function taddslashes($str) {
        if(!is_array($str)) {
            return addslashes($str);
        }

        $keys = array_keys($str);
        foreach ($keys as $k => $v) {
            $val = $str[$k];
            unset($str[$k]);
            $str[addslashes($k)] = taddslashes($val);
        }
        return $str;
    }

    /**
     *
     * 是否包含字符串
     * @param string $str        字符串
     * @param string $needle    查找的字符串
     */
    function strexists($str, $needle) {
        return stripos($str, $needle) !== false ? true : false;
    }

    /**
     * 分页函数
     *
     * @param int $row_count    总记录数
     * @param int $page     当前页
     * @param int $pagecount    总页数
     * @param int $skip     0常用翻页   大于0表示显示区间数
     * @param string $urlparam    外带URL地址
     * @param bool  $php_self   是否  /app/share/index?id=1访问模式
     * @return string   返回已经分好页的HTML代码
     */
    function page_method($row_count, $cur_page, $page_count, $skip = 0, $urlparam = '' , $php_self = true) {
        $cur_page = intval($cur_page);
        $page_count = intval($page_count);
        $skip = intval($skip);

        if($row_count < 1 || $page_count < 1){
            return false;
        }

        if($cur_page > $page_count){
            $cur_page =  $page_count;
        }

        //skip 必须是3以上
        if($skip > 0 && $skip < 4){
            $skip = 4;
        }

        //分页字符串
        $str = '';

        $self_page = '';
        //当前页URL
        if($php_self){
            $self_page = $_SERVER['PHP_SELF'];
        }
        $url = 'http://' . $_SERVER['HTTP_HOST'] . $self_page . $urlparam;

        $str = '<a href="' . $url . '&page=1" class="f1">首页</a>';

        if($skip < 1) {
            //普通分页
            $p_page = $cur_page - 1 ;
            $n_page = $cur_page + 1 ;

            $p_page = $p_page > 1 ? $p_page :1;
            $n_page = $n_page > $page_count ? $page_count : $n_page;

            $str .= '<a href="' . $url . '&page=' . $p_page . '">上一页</a>'.
            '<a href="' . $url . '&page=' . $n_page . '">下一页</a>';
        } else {

            $half = $skip%2;
            if($half < 1){
                $half =  $skip/2;
            }else{
                $half =  ceil($skip/2);
            }

            //区间分页
            //计算开始位置
            $start = $cur_page - $half + 1;
            $start =  $start < 1 ? 1 : $start;
            //计算结束位置
            $end = $start + $skip - 1;
            $end = $end > $page_count ? $page_count : $end;
            for($i = $start ; $i <= $end ; $i++){
                if($i == $cur_page) {
                    $str .= '<span>' . $i . '</span>';
                    continue;
                }
                $str .= '<a href="' . $url . '&page=' . $i . '" class="f1" >' . $i . '</a>';
            }

        }

        $str .= '<a href="' . $url . '&page=' . $page_count . '" class="f1">尾页</a>';

        return $str;
    }

    /**
     * 截取字符串
     *
     * @param  string $str           字符串
     * @param  int    $length        长度
     * @param  string $charset       编码
     * @param  bool   $suffix        是否加省略号
     * @return string
     */
    function subs($str, $length, $charset="utf-8", $suffix=true) {
        $start = 0;
        if (function_exists("mb_substr")) {
            if (mb_strlen($str, $charset) <= $length) {
                return $str;
            }
            $slice = mb_substr($str, $start, $length, $charset);
        } else {
            $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
            $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
            $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
            $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
            preg_match_all($re[$charset], $str, $match);
            if (count($match[0]) <= $length) {
                return $str;
            }
            $slice = join("", array_slice($match[0], $start, $length));
        }
        if ($suffix) {
            return $slice . "…";
        }
        return $slice;
    }

    /**
     * 销毁对象
     *
     * @param object $obj   对象
     * @return bool
     */
    function destroy(&$obj) {
        $obj = null;
        unset($obj);
        return true;
    }


    /**
     * 格式化对象字段
     *
     * @param array $info_array      传入的数据
     * @param array $format_array    类定义的字段格式
     * @param string $table 表名
     * @param int $base 库
     * @return array
     */
    function check_keys($info_array , $format_array = '', $table = '', $base = 0){
        global $_cooper;

        if(empty($info_array)){
            return false;
        }

        //非读取数据结构模式
        if(!$table) {
            if(empty($format_array)) {
                return false;
            }

            $info_array = array_intersect_key($info_array, $format_array);

            foreach($info_array as $k=>$v){
                //取得对应的类型和长度，并做空判断
                $type = $format_array[$k];
                if(!$type['type']){
                    return false;
                }
                //根据类型做数据转换
                switch($type['type']){
                    case 'string':
                        $v = strval($v);
                        //如果超过长度则返回不合法
                        if(mb_strlen($v,'utf-8') > $type['len']){
                            return false;
                        }
                        break;
                    case 'double':
                        $v = is_float($v)?$v:'';
                        break;
                    case 'integer':
                        $v = is_numeric($v)?$v:'';
                        break;
                    default:
                        $v = '';
                        break;
                }
                $info_array[$k] = $v;
            }
        } else  {
            //字段模式
            $format_array = F("_fields/{$table}");
            if(!$format_array) {
                $format_array = $_cooper->_mysql($base)->flush($table);
            }

            $info_array = array_intersect_key($info_array, $format_array['_type']);
            foreach($info_array as $k => $v) {
                $field_type = strtolower($format_array['_type'][$k]);
                if(false === strpos($field_type,'bigint') && false !== strpos($field_type,'int')) {
                    $info_array[$k] = intval($info_array[$k]);
                }elseif(false !== strpos($field_type,'float') || false !== strpos($field_type,'double')){
                    $info_array[$k] = floatval($info_array[$k]);
                }elseif(false !== strpos($field_type,'bool')){
                    $info_array[$k] = (bool)$info_array[$k];
                }
            }
        }
        return $info_array;
    }

    /**
     * 判断是否空字符串
     *
     * @param string $str 字符串
     * @return mixed
     */
    function is_null_str($str){
        $flag = false;
        $str = trim($str); //去掉空格
        if($str.'x' == 'x'){
            $flag = true;
        }
        return $flag;
    }

    /**
     * 获取带参数的url
     *
     * @param mixed $params
     */
    function get_parameter_url($url , $params=array())
    {
        if(!$url || empty($params)){
            return '#';
        }
        $url = $url.'?';
        foreach ($params as $key=>$val)
        {
            $url .= $key.'='.urlencode($val).'&';
        }
        $url = trim($url,'&');
        return $url;
    }

    /**
     * 取得上一级地址
     *
     */
    function get_refer(){
        $ref = $_SERVER['HTTP_REFERER'];
        return $ref != '' ? $ref : '/';
    }

    /**
     * 获取当前URL
     *
     */
    function cur_url()
    {
        $url = 'http';

        if ($_SERVER["HTTPS"] == "on")
        {
            $url .= "s";
        }
        $url .= "://";

        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
        }
        else
        {
            $url .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
        }
        return $url;
    }

    /**
     * 验证表单是否有效
     *
     * @param mixed $s_name          session名
     * @param mixed $post_timeout 间隔时间
     * @return bool 超时false 否则true
     */
    function form_session_timeout($s_name = 'form_post_time',$post_timeout = 2){
        if(is_null($_SESSION[$s_name])) { //会话中是否设置登录时间
            return false;
        }

        $time_diff = time() - $_SESSION[$s_name];

        if($time_diff < $post_timeout) { //设置登录间隔
            return false;
        }

        return true;
    }

    /**
     * 数组分页
     *
     * @param mixed $ary
     * @param mixed $page
     * @param mixed $pagesize
     */
    function array_paging($ary , $curpage = 1 , $pagesize = 10){
        if(!is_array($ary) || empty($ary)){
            return false;
        }
        $curpage = $curpage > 0 ? $curpage : 1;
        $count = count($ary);
        if($count < 1){
            return false;
        }
        $pagetotal = $count % $pagesize;
        if($pagetotal < 1) {
            $pagetotal = $count/$pagesize;
        } else {
            $pagetotal = ceil($count/$pagesize);
        }

        if($curpage > $pagetotal){
            $curpage = $pagetotal;
        }

        $start = ($curpage - 1) * $pagesize;
        $end =  $start + $pagesize;

        $start = $start >=0 ? $start : 0;
        $end  =  $end < $count ? $end : $count;


        $rows = array();
        for($i = $start ; $i < $end ; $i++){
            $rows[]  = $ary[$i];
        }
        return array(
        'row_count' => $count ,         //总数据
        'page_count' => $pagetotal ,    //总页数
        'cur_page' => $curpage ,        //当前页
        'page_size'=>  $pagesize,       //每页显示数
        'rows' => $rows             //数据集
        );
    }

    /**
     * 通过curl来获取
     *
     * @param mixed $url
     * @return mixed
     */
    function http_curl($url) {

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);              //CURL地址
        curl_setopt($curl, CURLOPT_HEADER, false);          //是否显示头信息
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);       //是否输入到页面
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 15);         //链接等待的时间 30 秒
        //curl_setopt($curl, CURLOPT_ENCODING, 'gzip');       //设置客户端支持gzip压缩
        $result = curl_exec($curl);
        curl_close($curl);

        return $result;
    }

    /**
     * 获取XML
     *
     * @param mixed $host
     * @param mixed $port
     * @param mixed $path
     * @return object
     */
    function get_xml($host,$port,$path){
        $fp=@fsockopen($host, $port, $errno, $errstr, 60);
        if($fp){
            $out = "GET ".$path." HTTP/1.1\r\n";
            $out .= "Host: ".$host."\r\n";
            $out.= 'User_Agent: XML-RPC Client\r\n';
            $out.= 'Accept-Charset:utf-8;\r\n';
            $out.='Content-Type: text/xml\r\n';
            $out.= "Connection: Close\r\n\r\n";
            $out = iconv('utf-8','gbk',$out);
            fwrite($fp,$out);
            while(!@feof($fp)){
                $result.=@fgets($fp,1024000);
            }
            fclose($fp);
        }
        $result = preg_replace("/(?:[\s\S]*)?charset=utf-8([\s\S]*)?/","\$1",$result);
        $result = trim($result);
        if(!$result){
            return false;
        }

        return simplexml_load_string($result);
    }


    /**
     * 获取随机码
     *
     */
    function get_vitify_code($length = 6){
        $pattern='123456789';
        for($i=0;$i<$length;$i++)
        {
            $key .= $pattern{mt_rand(0,8)};    //生成php随机数
        }
        return $key;
    }

    /**
     * 含Html的内容截取函数
     *
     * @param string $content   内容
     * @param int $maxlen       最大长度
     * @param string $charset   编码
     * @return string
     */
    function html_sub_string($body, $size = 300, $charset = 'utf-8') {
        $_size = mb_strlen($body, $charset);

        if($_size <= $size) {
            return;
        }

        $strlen_var = strlen($body);

        // 不包含 html 标签
        if(strpos($body, '<') === false){
            return mb_substr($body, 0, $size);
        }

        // 包含截断标志，优先
        if($e = strpos($body, '<!-- break -->')){
            return mb_substr($body, 0, $e);
        }

        // html 代码标记
        $html_tag = 0;

        // 摘要字符串
        $summary_string = '';

        /**
         * 数组用作记录摘要范围内出现的 html 标签
         * 开始和结束分别保存在 left 和 right 键名下
         * 如字符串为：<h3><p><b>a</b></h3>，假设 p 未闭合
         * 数组则为：array('left' => array('h3', 'p', 'b'), 'right' => 'b', 'h3');
         * 仅补全 html 标签，<? <% 等其它语言标记，会产生不可预知结果
         */
        $html_array = array('left' => array(), 'right' => array());
        for($i = 0; $i < $strlen_var; ++$i) {
            if(!$size){
                break;
            }

            $current_var = substr($body, $i, 1);

            if($current_var == '<'){
                // html 代码开始
                $html_tag = 1;
                $html_array_str = '';
            }else if($html_tag == 1){
                    // 一段 html 代码结束
                    if($current_var == '>'){
                        /**
                         * 去除首尾空格，如 <br /  > < img src="" / > 等可能出现首尾空格
                         */
                        $html_array_str = trim($html_array_str);

                        /**
                         * 判断最后一个字符是否为 /，若是，则标签已闭合，不记录
                         */
                        if(substr($html_array_str, -1) != '/'){

                            // 判断第一个字符是否 /，若是，则放在 right 单元
                            $f = substr($html_array_str, 0, 1);
                            if($f == '/'){
                                // 去掉 /
                                $html_array['right'][] = str_replace('/', '', $html_array_str);
                            }else if($f != '?'){
                                    // 判断是否为 ?，若是，则为 PHP 代码，跳过

                                    /**
                                     * 判断是否有半角空格，若有，以空格分割，第一个单元为 html 标签
                                     * 如 <h2 class="a"> <p class="a">
                                     */
                                    if(strpos($html_array_str, ' ') !== false){
                                        // 分割成2个单元，可能有多个空格，如：<h2 class="" id="">
                                        $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
                                    }else{
                                        /**
                                         * * 若没有空格，整个字符串为 html 标签，如：<b> <p> 等
                                         * 统一转换为小写
                                         */
                                        $html_array['left'][] = strtolower($html_array_str);
                                    }
                                }
                    }

                    // 字符串重置
                    $html_array_str = '';
                    $html_tag = 0;
                }else{
                    /**
                     * 将< >之间的字符组成一个字符串
                     * 用于提取 html 标签
                     */
                    $html_array_str .= $current_var;
                }
            }else{
                // 非 html 代码才记数
                --$size;
            }

            $ord_var_c = ord($body{$i});

            switch (true) {
                case (($ord_var_c & 0xE0) == 0xC0):
                    // 2 字节
                    $summary_string .= substr($body, $i, 2);
                    $i += 1;
                    break;
                case (($ord_var_c & 0xF0) == 0xE0):

                    // 3 字节
                    $summary_string .= substr($body, $i, 3);
                    $i += 2;
                    break;
                case (($ord_var_c & 0xF8) == 0xF0):
                    // 4 字节
                    $summary_string .= substr($body, $i, 4);
                    $i += 3;
                    break;
                case (($ord_var_c & 0xFC) == 0xF8):
                    // 5 字节
                    $summary_string .= substr($body, $i, 5);
                    $i += 4;
                    break;
                case (($ord_var_c & 0xFE) == 0xFC):
                    // 6 字节
                    $summary_string .= substr($body, $i, 6);
                    $i += 5;
                    break;
                default:
                    // 1 字节
                    $summary_string .= $current_var;
            }
        }

        if($html_array['left']){
            /**
             * 比对左右 html 标签，不足则补全
             */

            /**
             * 交换 left 顺序，补充的顺序应与 html 出现的顺序相反
             * 如待补全的字符串为：<h2>abc<b>abc<p>abc
             * 补充顺序应为：</p></b></h2>
             */
            $html_array['left'] = array_reverse($html_array['left']);

            foreach($html_array['left'] as $index => $tag){
                // 判断该标签是否出现在 right 中
                $key = array_search($tag, $html_array['right']);
                if($key !== false){
                    // 出现，从 right 中删除该单元
                    unset($html_array['right'][$key]);
                }else{
                    // 没有出现，需要补全
                    $summary_string .= '</'.$tag.'>';
                }
            }
        }
        return $summary_string;
    }


    /**
     * tc编码
     *
     * @param mixed $value
     * @return string
     */
    function tcsos_encode($value){
        $ary = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
        if(!$value){
            return false;
        }
        $encode = base64_encode($value);
        for($i = 0 ; $i < 5 ; $i++){
            $encode .= $ary[mt_rand(0,25)];
        }
        return  base64_encode($encode);
    }

    /**
     * tc解码
     *
     * @param string $value
     * @return string
     */
    function tcsos_decode($value){
        $ary = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
        if(!$value){
            return false;
        }
        $value = base64_decode($value);
        $length = strlen($value);
        $value = substr($value,0,$length - 5);
        return base64_decode($value);
    }

    /**
     * HTML标签闭合
     *
     * @author zhouqi 2012-2-20 AM 09:16:01
     * @param string $html      HTML内容
     * @return string
     */
    function closetags($body) {
        $strlen_var = strlen($body);
        // 不包含 html 标签
        if (strpos($body, '<') === false) {
            return $body;
        }
        // html 代码标记
        $html_tag = 0;
        // 摘要字符串
        $summary_string = '';

        /**
         * 数组用作记录摘要范围内出现的 html 标签
         * 开始和结束分别保存在 left 和 right 键名下
         * 如字符串为：< h3>< p>< b>a< /b>< /h3>，假设 p 未闭合
         * 数组则为：array('left' => array('h3', 'p', 'b'), 'right' => 'b', 'h3');
         * 仅补全 html 标签，
         */
        $html_array = array('left' => array(), 'right' => array());
        for ($i = 0; $i < $strlen_var; ++$i) {
            $current_var = substr($body, $i, 1);

            if ($current_var == '<') {
                // html 代码开始
                $html_tag = 1;
                $html_array_str = '';
            } else if ($html_tag == 1) {
                    // 一段 html 代码结束
                    if ($current_var == '>') {
                        /**
                         * 去除首尾空格，如 < img src="" / > 等可能出现首尾空格
                         */
                        $html_array_str = trim($html_array_str);

                        /**
                         * 判断最后一个字符是否为 /，若是，则标签已闭合，不记录
                         */
                        if (substr($html_array_str, -1) != '/') {
                            // 判断第一个字符是否 /，若是，则放在 right 单元
                            $f = substr($html_array_str, 0, 1);
                            if ($f == '/') {
                                // 去掉 /
                                $html_array['right'][] = str_replace('/', '', $html_array_str);
                            } else if ($f != '?') {
                                    // 判断是否为 ?，若是，则为 PHP 代码，跳过
                                    /**
                                     * 判断是否有半角空格，若有，以空格分割，第一个单元为 html 标签
                                     * 如< h2 class="a"> < p class="a">
                                     */
                                    if (strpos($html_array_str, ' ') !== false) {
                                        // 分割成2个单元，可能有多个空格，如：
                                        $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
                                    } else {
                                        /**
                                         * * 若没有空格，整个字符串为 html 标签，如：< b> < p> 等
                                         * 统一转换为小写
                                         */
                                        $html_array['left'][] = strtolower($html_array_str);
                                    }
                                }
                    }
                    // 字符串重置
                    $html_array_str = '';
                    $html_tag = 0;
                } else {
                    /**
                     * 将< >之间的字符组成一个字符串
                     * 用于提取 html 标签
                     */
                    $html_array_str .= $current_var;
                }
            } else {
                // 非 html 代码才记数
                --$size;
            }

            $ord_var_c = ord($body{$i});

            switch (true) {
                case (($ord_var_c & 0xE0) == 0xC0):
                    // 2 字节
                    $summary_string .= substr($body, $i, 2);
                    $i += 1;
                    break;
                case (($ord_var_c & 0xF0) == 0xE0):

                    // 3 字节
                    $summary_string .= substr($body, $i, 3);
                    $i += 2;
                    break;
                case (($ord_var_c & 0xF8) == 0xF0):
                    // 4 字节
                    $summary_string .= substr($body, $i, 4);
                    $i += 3;
                    break;
                case (($ord_var_c & 0xFC) == 0xF8):
                    // 5 字节
                    $summary_string .= substr($body, $i, 5);
                    $i += 4;
                    break;
                case (($ord_var_c & 0xFE) == 0xFC):
                    // 6 字节
                    $summary_string .= substr($body, $i, 6);
                    $i += 5;
                    break;
                default:
                    // 1 字节
                    $summary_string .= $current_var;
            }
        }

        if ($html_array['left']) {
            /**
             * 比对左右 html 标签，不足则补全
             */
            /**
             * 交换 left 顺序，补充的顺序应与 html 出现的顺序相反
             * 如待补全的字符串为：< h2>abc< b>abc< p>abc
             * 补充顺序应为：< /p>< /b>< /h2>
             */
            $html_array['left'] = array_reverse($html_array['left']);

            foreach ($html_array['left'] as $index => $tag) {
                // 判断该标签是否出现在 right 中
                $key = array_search($tag, $html_array['right']);
                if ($key !== false) {
                    // 出现，从 right 中删除该单元
                    unset($html_array['right'][$key]);
                } else {
                    // 没有出现，需要补全
                    $summary_string .= '';
                }
            }
        }
        return $summary_string;
    }

    /**
     * 数组转换XML
     *
     * @author zhouqi 2012-4-10 AM 11:54:16
     * @param array $array  数组
     * @param string $tag   主标签
     * @return object
     */
    function array2xml($array, $tag) {

        function ia2xml($array) {
            $xml = '';
            foreach($array as $k => $v) {
                if(is_bool($v)) {
                    $v = $v ? 'true' : 'false';
                }

                if(!is_array($v)) {
                    $xml .= "<{$k}>{$v}</{$k}>";
                    continue;
                }

                $xml .= "<{$k}>" . ia2xml($v) . "</{$k}>";
            }
            return $xml;
        }

        return simplexml_load_string("<{$tag}>" . ia2xml($array) . "</{$tag}>");
    }

    /**
     * seed用户自定义函数以微秒作为种子
     *
     * @author zhouqi 2012-5-3 PM 16:55:14
     */
    function seed() {
        list($msec, $sec) = explode(' ', microtime());
        return (float) $sec;
    }

    /**
     * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
     *
     * @author zhouqi 2012-5-3 PM 13:26:42
     * @param string $path  路径
     * @param string $value 值
     * @return int
     */
    function F($path, $value = '') {
        global $_cooper;
        static $_cache = array();
		//@author zhufu 2014-04-16 关闭了缓存则读取和写入都不执行
		$config = $_cooper->_config();
        if(!$config['runtime']['cache']) {
			return false;
        }
        $path = $_cooper->_root() . "/data/cache/{$path}.php";

        if($value !== '') {
            if(is_null($value)) {

                if(file_exists($path)) {
                    // 删除缓存
                    unlink($path);
                }
            } else {
                // 缓存数据
                $dir = dirname($path);

                // 目录不存在则创建
                if(!is_dir($dir)) {
                    mkdir_adv($dir);
                }

                if($config['runtime']['cache']) {
                    return file_put_contents($path, "<?php\nreturn ".var_export($value,true).";\n?>");
                }

                return true;
            }
        }

        if(isset($_cache[$path])) {
            return $_cache[$path];
        }

        // 获取缓存数据
        if(is_file($path)) {
            $value  = include $path;
            $_cache[$path] = $value;
        } else {
            $value = false;
        }
        return $value;
    }


    /**
     * 获取语言包信息
     *
     * @param string $name   信息
     * @param array $ary    替换的信息
     * @return string
     */
    function L($name, $ary = '') {
        global $_lang;
        return $_lang->get_msg($name, $ary);
    }

    /**
     * 无符号32位右移
     * @param mixed $x 要进行操作的数字，如果是字符串，必须是十进制形式
     * @param string $bits 右移位数
     * @return mixed 结果，如果超出整型范围将返回浮点数
     */
    function shr32($x, $bits){
        // 位移量超出范围的两种情况
        if($bits <= 0){
            return $x;
        }
        if($bits >= 32){
            return 0;
        }
        //转换成代表二进制数字的字符串
        $bin = decbin($x);
        $l = strlen($bin);
        //字符串长度超出则截取底32位，长度不够，则填充高位为0到32位
        if($l > 32){
            $bin = substr($bin, $l - 32, 32);
        }elseif($l < 32){
            $bin = str_pad($bin, 32, '0', STR_PAD_LEFT);
        }
        //取出要移动的位数，并在左边填充0
        return bindec(str_pad(substr($bin, 0, 32 - $bits), 32, '0', STR_PAD_LEFT));
    }

    /**
     * 无符号32位左移
     * @param mixed $x 要进行操作的数字，如果是字符串，必须是十进制形式
     * @param string $bits 左移位数
     * @return mixed 结果，如果超出整型范围将返回浮点数
     */
    function shl32 ($x, $bits){
        // 位移量超出范围的两种情况
        if($bits <= 0){
            return $x;
        }
        if($bits >= 32){
            return 0;
        }
        //转换成代表二进制数字的字符串
        $bin = decbin($x);
        $l = strlen($bin);
        //字符串长度超出则截取底32位，长度不够，则填充高位为0到32位
        if($l > 32){
            $bin = substr($bin, $l - 32, 32);
        }elseif($l < 32){
            $bin = str_pad($bin, 32, '0', STR_PAD_LEFT);
        }
        //取出要移动的位数，并在右边填充0
        return bindec(str_pad(substr($bin, $bits), 32, '0', STR_PAD_RIGHT));
    }

    /**
     * UNICODE解码
     *
     * @author zhouqi 2012-7-11 PM 02:24:25
     * @param string $name
     */
    function unicode_decode($name) {
        //转换编码，将Unicode编码转换成可以浏览的utf-8编码
        $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
        preg_match_all($pattern, $name, $matches);
        if (!empty($matches))
        {
            $name = '';
            for ($j = 0; $j < count($matches[0]); $j++)
            {
                $str = $matches[0][$j];
                if (strpos($str, '\\u') === 0)
                {
                    $code = base_convert(substr($str, 2, 2), 16, 10);
                    $code2 = base_convert(substr($str, 4), 16, 10);
                    $c = chr($code).chr($code2);
                    $c = iconv('UCS-2', 'UTF-8', $c);
                    $name .= $c;
                }
                else
                {
                    $name .= $str;
                }
            }
        }
        return $name;
    }

    /**
     * UNICODE加码
     *
     * @author zhouqi 2012-7-11 PM 02:26:18
     * @param string $name  内容
     */
    function unicode_encode($name) {
        $name = iconv('UTF-8', 'UCS-2', $name);
        $len = strlen($name);
        $str = '';
        for ($i = 0; $i < $len - 1; $i = $i + 2)
        {
            $c = $name[$i];
            $c2 = $name[$i + 1];
            if (ord($c) > 0)
            {   //两个字节的文字
                $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
            }
            else
            {
                $str .= $c2;
            }
        }
        return $str;
    }

    /**
     * gzip
     *
     * @author zhouqi 2012-7-20 PM 04:28:48
     * @param string $content   内容
     */
    function ob_gzip($content) {
        if(!$content) {
            return;
        }

        if(!headers_sent() && extension_loaded("zlib") && strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")){
            $content = gzencode($content,9);
            header("Content-Encoding: gzip");
            header("Vary: Accept-Encoding");
            header("Content-Length: ".strlen($content));
        }
        return $content;
    }

    /**
     * 打印JSON数据
     *
     * @param array $ary    数组
     */
    function echo_json($ary) {
        if($ary) {
            $ary['msg'] = L($ary['msg']);
        }

        echo json_encode($ary);
        exit;
    }

    /**
     * 图片尺寸显示图
     *
     * @author zhouqi 2012-8-17 AM 11:57:12
     * @param string $imgpath   图片路径
     * @param string $size      图片尺寸
     */
    function img_thumb($imgpath, $size = '') {
        if(!$imgpath) {
            return false;
        }

        if(!$size) {
            return $imgpath;
        }

        $ext = substr(strrchr($imgpath, '.'), 0);
        return "{$imgpath}_{$size}{$ext}";
    }

    /**
     * 对数据进行递归HTML标签转义处理
     *
     * @author zhouqi 2012-8-30 PM 01:33:43
     * @param string $val   值
     */
    function htmlspecial($val) {
        if(is_array($val)) {
            $val = array_map('htmlspecial', $val);
        } else {
            $val = htmlspecialchars($val);
        }

        return $val;
    }

    /**
     * UBB内容转换，只针对xheditor
     *
     * @author zhouqi 2012-8-30 PM 01:33:46
     * @param string $sUBB      UBB内容
     * @param string $emotPath 表情根目录
     * @return mixed
     */
    function ubb2html($sUBB, $emotPath = '/plugin/cooperation_unit/xheditor/xheditor_emot/'){
        $sHtml=$sUBB;

        global $emotPath,$cnum,$arrcode,$bUbb2htmlFunctionInit;$cnum=0;$arrcode=array();

        //转义内容里面的单双引号
        $sHtml = str_replace(array("'", '"', '&quot;'), array('＇', '＂', '＂'), $sHtml);

        if(!$bUbb2htmlFunctionInit){
            function saveCodeArea($match)
            {
                global $cnum,$arrcode;
                $cnum++;$arrcode[$cnum]=$match[0];
                return "[\tubbcodeplace_".$cnum."\t]";
        }}
        $sHtml=preg_replace_callback('/\[code\s*(?:=\s*((?:(?!")[\s\S])+?)(?:"[\s\S]*?)?)?\]([\s\S]*?)\[\/code\]/i','saveCodeArea',$sHtml);

        $sHtml=preg_replace("/&/",'&amp;',$sHtml);
        $sHtml=preg_replace("/</",'&lt;',$sHtml);
        $sHtml=preg_replace("/>/",'&gt;',$sHtml);
        $sHtml=preg_replace("/\r?\n/",'<br />',$sHtml);

        $sHtml=preg_replace("/\[(\/?)(b|u|i|s|sup|sub)\]/i",'<$1$2>',$sHtml);
        $sHtml=preg_replace('/\[color\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]/i','<span style="color:$1;">',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getSizeName($match)
            {
                $arrSize=array('10px','13px','16px','18px','24px','32px','48px');
                if(preg_match("/^\d+$/",$match[1]))$match[1]=$arrSize[$match[1]-1];
                return '<span style="font-size:'.$match[1].';">';
        }}
        $sHtml=preg_replace_callback('/\[size\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]/i','getSizeName',$sHtml);
        $sHtml=preg_replace('/\[font\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]/i','<span style="font-family:$1;">',$sHtml);
        $sHtml=preg_replace('/\[back\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]/i','<span style="background-color:$1;">',$sHtml);
        $sHtml=preg_replace("/\[\/(color|size|font|back)\]/i",'</span>',$sHtml);

        for($i=0;$i<3;$i++)$sHtml=preg_replace('/\[align\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\](((?!\[align(?:\s+[^\]]+)?\])[\s\S])*?)\[\/align\]/','<p align="$1">$2</p>',$sHtml);
        $sHtml=preg_replace('/\[img\]\s*(((?!")[\s\S])+?)(?:"[\s\S]*?)?\s*\[\/img\]/i','<img src="$1" alt="" />',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getImg($match)
            {
                $alt=$match[1];$p1=$match[2];$p2=$match[3];$p3=$match[4];$src=$match[5];
                $a=$p3?$p3:(!is_numeric($p1)?$p1:'');
                return '<img src="'.$src.'" alt="'.$alt.'"'.(is_numeric($p1)?' width="'.$p1.'"':'').(is_numeric($p2)?' height="'.$p2.'"':'').($a?' align="'.$a.'"':'').' />';
        }}
        $sHtml=preg_replace_callback('/\[img\s*=([^,\]]*)(?:\s*,\s*(\d*%?)\s*,\s*(\d*%?)\s*)?(?:,?\s*(\w+))?\s*\]\s*(((?!")[\s\S])+?)(?:"[\s\S]*)?\s*\[\/img\]/i','getImg',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getEmot($match)
            {
                global $emotPath;
                $arr=split(',',$match[1]);
                if(!isset($arr[1])){$arr[1]=$arr[0];$arr[0]='default';}
                $path=$emotPath.$arr[0].'/'.$arr[1].'.gif';
                return '<img src="'.$path.'" alt="'.$arr[1].'" />';
        }}
        $sHtml=preg_replace_callback('/\[emot\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\/\]/i','getEmot',$sHtml);
        $sHtml=preg_replace('/\[url\]\s*(((?!")[\s\S])*?)(?:"[\s\S]*?)?\s*\[\/url\]/i','<a href="$1">$1</a>',$sHtml);
        $sHtml=preg_replace('/\[url\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]\s*([\s\S]*?)\s*\[\/url\]/i','<a href="$1">$2</a>',$sHtml);
        $sHtml=preg_replace('/\[email\]\s*(((?!")[\s\S])+?)(?:"[\s\S]*?)?\s*\[\/email\]/i','<a href="mailto:$1">$1</a>',$sHtml);
        $sHtml=preg_replace('/\[email\s*=\s*([^\]"]+?)(?:"[^\]]*?)?\s*\]\s*([\s\S]+?)\s*\[\/email\]/i','<a href="mailto:$1">$2</a>',$sHtml);
        $sHtml=preg_replace("/\[quote\]/i",'<blockquote>',$sHtml);
        $sHtml=preg_replace("/\[\/quote\]/i",'</blockquote>',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getFlash($match)
            {
                $w=$match[1];$h=$match[2];$url=$match[3];
                if(!$w)$w=480;if(!$h)$h=400;
                return '<embed type="application/x-shockwave-flash" src="'.$url.'" wmode="opaque" quality="high" bgcolor="#ffffff" menu="false" play="true" loop="true" width="'.$w.'" height="'.$h.'" />';
        }}
        $sHtml=preg_replace_callback('/\[flash\s*(?:=\s*(\d+)\s*,\s*(\d+)\s*)?\]\s*(((?!")[\s\S])+?)(?:"[\s\S]*?)?\s*\[\/flash\]/i','getFlash',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getMedia($match)
            {
                $w=$match[1];$h=$match[2];$play=$match[3];$url=$match[4];
                if(!$w)$w=480;if(!$h)$h=400;
                return '<embed type="application/x-mplayer2" src="'.$url.'" enablecontextmenu="false" autostart="'.($play=='1'?'true':'false').'" width="'.$w.'" height="'.$h.'" />';
        }}
        $sHtml=preg_replace_callback('/\[media\s*(?:=\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+)\s*)?)?\]\s*(((?!")[\s\S])+?)(?:"[\s\S]*?)?\s*\[\/media\]/i','getMedia',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getTable($match)
            {
                return '<table'.(isset($match[1])?' width="'.$match[1].'"':'').(isset($match[2])?' bgcolor="'.$match[2].'"':'').'>';
        }}
        $sHtml=preg_replace_callback('/\[table\s*(?:=(\d{1,4}%?)\s*(?:,\s*([^\]"]+)(?:"[^\]]*?)?)?)?\s*\]/i','getTable',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getTR($match){return '<tr'.(isset($match[1])?' bgcolor="'.$match[1].'"':'').'>';}}
        $sHtml=preg_replace_callback('/\[tr\s*(?:=(\s*[^\]"]+))?(?:"[^\]]*?)?\s*\]/i','getTR',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getTD($match){
                $col=isset($match[1])?$match[1]:0;$row=isset($match[2])?$match[2]:0;$w=isset($match[3])?$match[3]:null;
                return '<td'.($col>1?' colspan="'.$col.'"':'').($row>1?' rowspan="'.$row.'"':'').($w?' width="'.$w.'"':'').'>';
        }}
        $sHtml=preg_replace_callback("/\[td\s*(?:=\s*(\d{1,2})\s*,\s*(\d{1,2})\s*(?:,\s*(\d{1,4}%?))?)?\s*\]/i",'getTD',$sHtml);
        $sHtml=preg_replace("/\[\/(table|tr|td)\]/i",'</$1>',$sHtml);
        $sHtml=preg_replace("/\[\*\]((?:(?!\[\*\]|\[\/list\]|\[list\s*(?:=[^\]]+)?\])[\s\S])+)/i",'<li>$1</li>',$sHtml);
        if(!$bUbb2htmlFunctionInit){
            function getUL($match)
            {
                $str='<ul';
                if(isset($match[1]))$str.=' type="'.$match[1].'"';
                return $str.'>';
        }}
        $sHtml=preg_replace_callback('/\[list\s*(?:=\s*([^\]"]+))?(?:"[^\]]*?)?\s*\]/i','getUL',$sHtml);
        $sHtml=preg_replace("/\[\/list\]/i",'</ul>',$sHtml);
        $sHtml=preg_replace("/\[hr\/\]/i",'<hr />',$sHtml);

        for($i=1;$i<=$cnum;$i++)$sHtml=str_replace("[\tubbcodeplace_".$i."\t]", $arrcode[$i],$sHtml);

        if(!$bUbb2htmlFunctionInit){
            function fixText($match)
            {
                $text=$match[2];
                $text=preg_replace("/\t/",'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',$text);
                $text=preg_replace("/ /",'&nbsp;',$text);
                return $match[1].$text;
        }}
        $sHtml=preg_replace_callback('/(^|<\/?\w+(?:\s+[^>]*?)?>)([^<$]+)/i','fixText',$sHtml);

        $bUbb2htmlFunctionInit=true;

        return $sHtml;
    }

    /**
     * 获取手机类型，针对于拨号使用
     *
     * @param mixed $type
     */
    function _mobile_type($type="wtai://wp/mc;"){
        $string = strtolower($_SERVER [ 'HTTP_USER_AGENT' ]);

        $regex_match = array("iphone"=>"callto:", "android"=>"wtai://wp/mc;");

        foreach($regex_match as $k => $v) {
            if(stripos($string, $k) === false) {
                continue;
            }
            $type = $v;
            break;
        }
        return $type;
    }
    /**
    *递归创建目录
    */
    function mkdir_adv($dir){
		if(is_dir($dir)){
			return true;
		}
		$tmp = dirname($dir);
		if(!is_dir($tmp)){
			mkdir_adv($tmp);
		}
		return mkdir($dir);
    }

    /**
    * 根据IP地址获取城市，有7天的cookie缓存
    * @author zhufu 2013-08-16
    *
    * @param string $default 默认的城市
    */
    function get_city_by_ip($default='重庆'){
        global $_site;
        $city_name = get_cookie('ip_city');
        if(!$city_name){
            $ipinfo = $_site->_area()->get_ip_info();
            $city_name = $ipinfo[1]?$ipinfo[1]:'重庆';
            set_cookie('ip_city', $city_name,7);
        }
        return $city_name;
    }

    /**
    * 返回字符串长度 包括中英文
    * @author leiqianyong 2013-04-19
    *
    * @param  string $str           字符串
    * @param  string $charset       编码
    * @return int 长度
    */
    function character_length_ch($str, $charset="utf-8"){
        if (function_exists("mb_substr")) {
            return mb_strlen($str, $charset) ;
        }
        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        return count($match[0]);
    }

    /**
    * 检查密码是否合格
    * @author zhufu 2013-08-27
    *
    * @param string $password 用户输入的密码
    * @return boolean 合格返回true,不合格返回false
    */
    function check_password($password){
        if(preg_match("/^(?!\d+$)(?![a-zA-Z_]+$)[\w]{6,20}/", $password)){
            return true ;
        }
        return false;
    }

    /**
    * 过滤关键词
    * @author zhufu 2013-10-09
    */
    function banned_words($str){
    	global $_site;
    	$banned_words = $_site->data_config['banned_words'];
    	if(!$banned_words){
    		return $str;
    	}
    	foreach($banned_words as $v){
    		$str = preg_replace("/{$v}/i", '**', $str);
    	}
    	return $str;
    }

    /**
    * 页面输出函数
    * @author zhufu 2014-04-14
    *
    * @param string $vlaue 要输出的字符串
    */
    function tc_echo($value, $quote_style=ENT_COMPAT, $strip=true){
        $value = $strip ? stripcslashes($value) : $value;
        return htmlspecialchars($value, $quote_style);
    }


    /**
     * 数据签名认证
     * @param  array  $data 被认证的数据
     * @return string       签名
     */
    function data_auth_sign($data) {
    	//数据类型检测
    	if(!is_array($data)){
    		$data = (array)$data;
    	}
    	ksort($data); //排序
    	$code = http_build_query($data); //url编码并生成query字符串
    	$sign = sha1($code); //生成签名
    	return $sign;
    }

    /**
     * 检测账号是否登录
     * @return integer 0-未登录，大于0-当前登录用户ID
     */
    function is_cookie_login($tag='admin'){
    	$user = unserialize(base64_decode(get_cookie($tag.'_info')));
    	$userauth = get_cookie($tag);
    	if (empty($user)) {
    		return 0;
    	} else {
    		return $userauth == data_auth_sign($user) ? $user['uid'] : 0;
    	}
    }

    /**
     * 将间隔秒数转换车字符时间
     * @param int $seconds
     * @return string
     */
    function timeparsesecond($seconds){
    	$seconds = (int)$seconds;
    	if($seconds<3600){
    		$format_time = gmstrftime(' %M 分 %S 秒 ', $seconds);
    	}elseif( $seconds<86400 ){//如果不到一天
    		$format_time = gmstrftime('%H 时 %M 分 %S 秒 ', $seconds);
    	}else{
    		$time = explode(' ', gmstrftime('%j %H %M %S', $seconds));
    		$format_time = ($time[0]-1).'天'.$time[1].'时'.$time[2].'分'.$time[3].'秒';
    	}
    	return $format_time;
    }


    /**
     * 判断是否是总管理
     * @param unknown $id
     */
    function is_admin($id){
    	if(empty($id))return false;

    	$admin=array(1);

    	return  in_array($id, $admin)?true:false;
    }


    /**
     * 数据容量格式转换
     * @param unknown $size  字节
     * @param number $dec  保留位数
     * @return string
     */
    function byte_format($size,$dec=2){
    	$a = array("B", "KB", "MB", "GB", "TB", "PB","EB","ZB","YB");
    	$pos = 0;
    	while ($size >= 1024){
    		$size /= 1024;
    		$pos++;
    	}
    	return round($size,$dec)." ".$a[$pos];
    }


    function byte_parse($size,$dec=2){
    	$a = array("B", "KB", "MB", "GB", "TB", "PB","EB","ZB","YB");
    	$pos = 0;
    	while ($size >= 1024){
    		$size /= 1024;
    		$pos++;
    	}
    	$rtn['size']=round($size,$dec);
    	$rtn['cell']=$a[$pos];

    	return $rtn;
    }


    function car_state($vo){
    	if(empty($vo))return false;

    	$rtn['state']=0;

    	if($vo['codeid']==0){
    		$rtn['msg']='未绑设备';
    		return $rtn;
    	}

    	if($vo['state']==0){
    		$rtn['msg']='等待确认';
    		return $rtn;
    	}

    	if($vo['endtime']<time()){
    		$rtn['msg']='请续费';
    		return $rtn;
    	}

   		$rtn['msg']='工作中';
   		$rtn['state']=1;
   		return $rtn;
    }

    function service_phone(){
    	return '13996100033';
    }

    //设备充值套餐
    function cash_menu($type=1){
    	$prtn[1]=array(
    			1=>array('money'=>2,'time'=>2592000),
    			2=>array('money'=>50,'time'=>7776000),
    			3=>array('money'=>100,'time'=>15811200),
    			4=>array('money'=>300,'time'=>31536000),
    			5=>array('money'=>0,'time'=>604800),
    	);

    	$prtn[2]=array(
    			1=>array('title'=>'套餐一 (每月（30天）)'),
    			2=>array('title'=>'套餐二 (一季度（90天）)'),
    			3=>array('title'=>'套餐三 (半年（183天）)'),
    			4=>array('title'=>'套餐四 (一年（365天）)'),
    			5=>array('title'=>'免费试用期 7天'),
    	);
		/**
    	$prtn[1]=array(
    			1=>array('money'=>2,'time'=>86400),
    			2=>array('money'=>50,'time'=>2592000),
    			3=>array('money'=>100,'time'=>10368000),
    			4=>array('money'=>300,'time'=>31536000),
    			5=>array('money'=>0,'time'=>604800),
    	);

    	$prtn[2]=array(
    			1=>array('title'=>'套餐一 (2 元/台.每天)'),
    			2=>array('title'=>'套餐二 (50元/台.每月（30天）)'),
    			3=>array('title'=>'套餐三 (100元/台.每季度（120天）)'),
    			4=>array('title'=>'套餐四 (300元/台.每季度（365天）)'),
    			5=>array('title'=>'免费试用期 7天'),
    	);
    	**/
    	return $prtn[$type];
    }


    /**
     * 计算两点地理坐标之间的距离
     * @param  Decimal $longitude1 起点经度
     * @param  Decimal $latitude1  起点纬度
     * @param  Decimal $longitude2 终点经度
     * @param  Decimal $latitude2  终点纬度
     * @param  Int     $unit       单位 1:米 2:公里
     * @param  Int     $decimal    精度 保留小数位数
     * @return Decimal
     */
    function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=1, $decimal=2){

    	$EARTH_RADIUS = 6370.996; // 地球半径系数
    	$PI = 3.1415926;

    	$radLat1 = $latitude1 * $PI / 180.0;
    	$radLat2 = $latitude2 * $PI / 180.0;

    	$radLng1 = $longitude1 * $PI / 180.0;
    	$radLng2 = $longitude2 * $PI /180.0;

    	$a = $radLat1 - $radLat2;
    	$b = $radLng1 - $radLng2;

    	$distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
    	$distance = $distance * $EARTH_RADIUS * 1000;

    	if($unit==2){
    		$distance = $distance / 1000;
    	}

    	return round($distance, $decimal);

    }



    /**
     * 从坐标数组中过滤无效坐标
     * @param array $maps  坐标数据包
     * @param int $ctime   图片登记时间，用来筛除一小时外的坐标记录
     */
    function coordClear($maps,$ctime=0){
    	$result = array();
    	$lastcoord = array();
    	$maxspeed = 15;	//时速120对应每秒33.33米
    	$disall = 0;
    	$_time=3600*1; //有效时间范围
	    $_i=0;
    	foreach($maps as $k=>$v){
    		//排除无时间记录，超出指定时间范围的记录
    		$nowtime=strtotime($v['createTime']);
    		if(empty($nowtime) || ($ctime-$nowtime)>$_time)continue;

    		//排除无效坐标
    		if($v['longitude']<0.1 || $v['latitude'] < 0.1)continue;

    		//排除相邻相同坐标,误差为一米
    		$tmpx = abs($lastcoord['longitude'] - $v['longitude']);
    		$tmpy = abs($lastcoord['latitude'] - $v['latitude']);
    		if(($tmpx+$tmpy)<0.000009 || ($tmpx+$tmpy)==0)continue;

    		//计算距离
    		if($_i > 0){
    			//$v['dis'] = round(GetDistance($lastcoord['latitude'], $lastcoord['longitude'], $v['latitude'], $v['longitude']), 2);
                $v['dis'] = round(GetDistance($lastcoord['longitude'],$lastcoord['latitude'], $v['longitude'],$v['latitude']), 2);
    			$v['speed']=sprintf("%.2f",($v['dis']/(strtotime($v['createTime'])-strtotime($lastcoord['createTime']))));
    			if($v['speed']>$maxspeed)continue;
    		}
    		else{
    			$v['dis'] = 0;
    			$v['speed'] = 0;
    		}
		    $_i++;
    		$result[] = $v;
    		$lastcoord = array('longitude'=>$v['longitude'],'latitude'=>$v['latitude'],'createTime'=>$v['createTime']);
    	}

    	//简单粗暴删除速度超范围的点  20181103
        /***
    	$res=array();
    	foreach($result as $vo){
    		if($vo['speed']>$maxspeed)continue;
    		$res[]=$vo;
    	}
         * **/

    	return $result;



    	//判断偏离坐标
    	$len = count($result);
    	$maps = array();
    	for($i=0;$i<$len;$i++){
    		$timer = strtotime($result[$i+1]['createTime']) - strtotime($result[$i]['createTime']);
    		$tmpdis = $result[$i+1]['dis'];
    		if($tmpdis / $timer > $maxspeed){
    			//速度出现异常
    			$timer = strtotime($result[$i+2]['createTime']) - strtotime($result[$i+1]['createTime']);
    			$tmpdis = $result[$i+2]['dis'];
    			if($tmpdis / $timer > $maxspeed){
    				//速度再次出现异常
    				$maps[] = $result[$i];
    				$maps[] = $result[$i+2];
    				$i++;
    				$i++;  //应该移到第二个之后，不然会出现重复问题  @author leiqianyong 2018-11-1 14:48 PM
    			}
    			else{
    				$maps[] = $result[$i+1];
    				$i++;
    			}
    		}
    		else{
    			$maps[] = $result[$i];
    		}
    	}
    	return $maps;
    }


    function secToTime($times){
    	$result = '';
    	if ($times>0) {
    	    //统一使用分钟单位
            $minute = floor($times/60);
            return $minute?$minute.'分':'';

    		$hour = floor($times/3600);
    		$minute = floor(($times-3600 * $hour)/60);
    		$second = floor((($times-3600 * $hour) - 60 * $minute) % 60);


    		$hour = strlen($hour) == 1 ? $hour : $hour;
    		$minute = strlen($minute) == 1 ? $minute : $minute;
    		$second = strlen($second) == 1 ? $second : $second;
    		$result = ($hour?$hour.'小时':'').($minute?$minute.'分':'').($second?$second.'秒':'');
    	}
    	return $result;
    }

    function stringToarray($data) {
    	if($data == '') return array();
    	@eval("\$array = $data;");
    	return $array;
    }



